// パーティデータのロード int inter_party_init() { char line[8192]; struct party *p; FILE *fp; int c=0; party_db=numdb_init(); if( (fp=fopen(party_txt,"r"))==NULL ) return 1; while(fgets(line,sizeof(line),fp)){ int i,j=0; if( sscanf(line,"%d\t%%newid%%\n%n",&i,&j)==1 && j>0 && party_newid<=i){ party_newid=i; continue; } p=(struct party *)aCalloc(1,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 mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id) { struct party_data *p; int i,lv; p = idb_get(party_db, party_id); if (!p) return 0; for(i = 0; i < MAX_PARTY; i++) { if(p->party.member[i].account_id == account_id && p->party.member[i].char_id == char_id) { mapif_party_leaved(party_id, account_id, char_id); lv = p->party.member[i].lv; if(p->party.member[i].online) p->party.count--; memset(&p->party.member[i], 0, sizeof(struct party_member)); p->size--; if (lv == p->min_lv || lv == p->max_lv || p->family) { if(p->family) p->family = 0; //Family state broken. int_party_check_lv(p); } if (party_check_empty(&p->party) == 0) mapif_party_info(-1, &p->party); return 0; } } return 0; }
// パーティデータのロード int inter_party_init() { char line[8192]; struct party *p; FILE *fp; int c=0; party_db=numdb_init(); if( (fp=fopen(party_txt,"r"))==NULL ) return 1; while(fgets(line,sizeof(line),fp)){ p=malloc(sizeof(struct party)); if(p==NULL){ printf("int_party: out of memory!\n"); exit(0); } 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); } c++; } fclose(fp); // printf("int_party: %s read done (%d parties)\n",party_txt,c); return 0; }
//Request leave party int mapif_parse_PartyLeave(int fd, int party_id, uint32 account_id, uint32 char_id, char *name, enum e_party_member_withdraw type) { struct party_data *p; int i,j=-1; p = inter_party_fromsql(party_id); if( p == NULL ) {// Party does not exists? if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", schema_config.char_db, party_id) ) Sql_ShowDebug(sql_handle); return 0; } for (i = 0; i < MAX_PARTY; i++) { if(p->party.member[i].account_id == account_id && p->party.member[i].char_id == char_id) { break; } } if (i >= MAX_PARTY) return 0; //Member not found? mapif_party_withdraw(party_id, account_id, char_id, name, type); if (p->party.member[i].leader){ // TODO: Official allow 'leaderless' party p->party.member[i].account_id = 0; for (j = 0; j < MAX_PARTY; j++) { if (!p->party.member[j].account_id) continue; mapif_party_withdraw(party_id, p->party.member[j].account_id, p->party.member[j].char_id, p->party.member[j].name, type); p->party.member[j].account_id = 0; } //Party gets deleted on the check_empty call below. } else { inter_party_tosql(&p->party,PS_DELMEMBER,i); j = p->party.member[i].lv; if(p->party.member[i].online) p->party.count--; memset(&p->party.member[i], 0, sizeof(struct party_member)); p->size--; if (j == p->min_lv || j == p->max_lv || p->family) { if(p->family) p->family = 0; //Family state broken. int_party_check_lv(p); } } if (party_check_empty(p) == 0) mapif_party_info(-1, &p->party, 0); return 0; }
// パーティ脱退要求 void mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id) { const struct party *p1 = partydb_load_num(party_id); struct party p2; int i; if(p1 == NULL) return; memcpy(&p2,p1,sizeof(struct party)); for(i=0;i<MAX_PARTY;i++){ if(p2.member[i].account_id == account_id && p2.member[i].char_id == char_id) { mapif_party_leaved(party_id,account_id,p2.member[i].char_id,p2.member[i].name); memset(&p2.member[i],0,sizeof(struct party_member)); if(fd >= 0) { // キャラ削除でない場合はパーティIDを0に初期化 const struct mmo_chardata *cd = chardb_load(char_id); if(cd) { struct mmo_charstatus st; memcpy(&st, &cd->st, sizeof(st)); st.party_id = 0; chardb_save(&st); } } if( party_check_empty(&p2) ) { // 空になったので解散 mapif_party_broken(p2.party_id,0); partydb_delete(p2.party_id); } else { // まだ人がいるのでデータ送信 mapif_party_info(-1,&p2); if( p2.exp>0 && !party_check_exp_share(&p2,0) ){ p2.exp=0; mapif_party_optionchanged(fd,&p2,0,0); } partydb_save(&p2); } return; } } return; }
// パーティ脱退要求 void mapif_parse_PartyLeave(int, int party_id, int account_id) { struct party *p = party_db.search(party_id); if (!p) return; for (int i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id != account_id) continue; mapif_party_leaved(party_id, account_id, p->member[i].name); p->member[i] = party_member{}; if (party_check_empty(p) == 0) mapif_party_info(-1, p); // まだ人がいるのでデータ送信 return; } }
// パ?ティデ?タのロ?ド int inter_party_init() { char line[8192]; struct party_data *p; FILE *fp; int c = 0; int i, j; party_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); if ((fp = fopen(party_txt, "r")) == NULL) return 1; while(fgets(line, sizeof(line), fp)) { j = 0; if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) { party_newid = i; continue; } p = (struct party_data*)aCalloc(sizeof(struct party_data), 1); if (p == NULL){ ShowFatalError("int_party: out of memory!\n"); exit(0); } memset(p, 0, sizeof(struct party_data)); if (inter_party_fromstr(line, &p->party) == 0 && p->party.party_id > 0) { int_party_calc_state(p); if (p->party.party_id >= party_newid) party_newid = p->party.party_id + 1; idb_put(party_db, p->party.party_id, p); party_check_empty(&p->party); } else { ShowError("int_party: broken data [%s] line %d\n", party_txt, c + 1); aFree(p); } c++; } fclose(fp); return 0; }
//------------------------ // A member leaves a party //------------------------ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { struct party *p; int i; p = numdb_search(party_db, (CPU_INT)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); // Sending party information to map-server // �܂��l������̂Ńf�[�^���M break; } } } return 0; }
// パーティ脱退要求 int mapif_parse_PartyLeave(int fd,int party_id,int account_id) { struct party *p=NULL; p=numdb_search(party_db,party_id); if(p!=NULL){ int i; 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);// まだ人がいるのでデータ送信 else inter_party_save(); // 解散したのでセーブ return 0; } } } return 0; }
//------------------------------ // Init inter-server for parties //------------------------------ void 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; while(fgets(line, sizeof(line), fp)) { // fgets reads until maximum one less than size and add '\0' -> so, it's not necessary to add -1 if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r') continue; // it's not necessary to remove 'carriage return ('\n' or '\r') j = 0; if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0) { if (party_newid < i) party_newid = i; continue; } CALLOC(p, struct party, 1); 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, (CPU_INT)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; }
// パーティデータのロード void inter_party_init(void) { io::ReadFile in(party_txt); if (!in.is_open()) return; // TODO: convert to use char_id AString line; int c = 0; while (in.getline(line)) { PartyId i; if (extract(line, record<'\t'>(&i, "%newid%"_s)) && party_newid < i) { party_newid = i; continue; } PartyMost pm; PartyPair pp{PartyId(), borrow(pm)}; if (extract(line, &pp) && pp.party_id) { if (party_newid < next(pp.party_id)) party_newid = next(pp.party_id); party_check_deleted_init(pp); party_db.insert(pp.party_id, pm); // note: this is still referring to the noncanonical copy of // the PartyMost pointer. This is okay, though. party_check_empty(pp); } else { PRINTF("int_party: broken data [%s] line %d\n"_fmt, party_txt, c + 1); } c++; } }
// パーティデータのロード int inter_party_init(void) { std::ifstream in(party_txt.c_str()); if (!in.is_open()) return 1; // TODO: convert to use char_id, and change to extract() FString line; int c = 0; while (io::getline(in, line)) { int i, j = 0; if (SSCANF(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) { party_newid = i; continue; } struct party p {}; if (extract(line, &p) && p.party_id > 0) { if (p.party_id >= party_newid) party_newid = p.party_id + 1; party_db.insert(p.party_id, p); party_check_empty(&p); } else { PRINTF("int_party: broken data [%s] line %d\n", party_txt, c + 1); } c++; } // PRINTF("int_party: %s read done (%d parties)\n", party_txt, c); return 0; }
//------------------------ // A member leaves a party //------------------------ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { char t_member[49]; // 24 * 2 + NULL int i, j; int flag; inter_party_fromsql(party_id); // fill party_tmp with informations of the party (or set all values to 0) if (party_tmp.party_id > 0) { for(i = 0; i < MAX_PARTY; i++) { if (party_tmp.member[i].account_id == account_id) { //printf("member leave the party #%d: account_id = %d.\n", party_id, account_id); mapif_party_leaved(party_id, account_id, party_tmp.member[i].name); // Update character information db_sql_escape_string(t_member, party_tmp.member[i].name, strlen(party_tmp.member[i].name)); sql_request("UPDATE `%s` SET `party_id`='0' WHERE `account_id`='%d' AND `name`='%s'", char_db, account_id, t_member); // Update character in memory for(j = 0; j < char_num; j++) if (char_dat[j].account_id == account_id && strncmp(char_dat[j].name, party_tmp.member[i].name, 24) == 0) { char_dat[j].party_id = 0; break; } //printf("Delete member %s from party #%d.\n", p->member[i].name, party_id); // if it's leader, remove all other members if (party_tmp.member[i].leader == 1) { flag = 0; for(j = 0; j < MAX_PARTY; j++) { if (party_tmp.member[j].account_id > 0 && j != i) { mapif_party_leaved(party_id, party_tmp.member[j].account_id, party_tmp.member[j].name); flag++; //printf("Delete member %s from party #%d (Leader breaks party).\n", party_tmp->member[j].name, party_id); } } if (flag > 0) { // Update char information in database sql_request("UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id); } // Update characters in memory for(j = 0; j < char_num; j++) if (char_dat[j].party_id == party_id) char_dat[j].party_id = 0; // Delete the party. sql_request("DELETE FROM `%s` WHERE `party_id`='%d'", party_db, party_id); //printf("Leader breaks party #%d.\n", party_id); memset(&party_tmp, 0, sizeof(struct party)); // remove party from memory for(j = 0; j < party_num; j++) if (partys[j].party_id == party_id) { // if found if (j != (party_num - 1)) memcpy(&partys[j], &partys[party_num - 1], sizeof(struct party)); party_num--; break; } } else { memset(&party_tmp.member[i], 0, sizeof(struct party_member)); // Update party in memory (party_tmp is not pointer on &partys[j]) for(j = 0; j < party_num; j++) { if (partys[j].party_id == party_id) { // if found memcpy(&partys[j], &party_tmp, sizeof(struct party)); break; } } } // leader is always the last member, but with deletion of char, that can be different if (party_check_empty(&party_tmp) == 0) mapif_party_info(-1, &party_tmp); // Sending party information to map-server // �܂��l������̂Ńf�[�^���M break; } } // party not found, suppress characters with this party } else { sql_request("UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id); // Update character in memory for(i = 0; i < char_num; i++) if (char_dat[i].party_id == party_id) char_dat[i].party_id = 0; } return 0; }
// パーティ脱退要求 int mapif_parse_PartyLeave(int fd,int party_id,int account_id) { char t_member[2*NAME_LENGTH]; struct party *p = party_pt; if (p == NULL) { ShowFatalError("int_party: out of memory !\n"); return 0; } inter_party_fromsql(party_id, p); if (p->party_id >= 0) { int i; 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); // Update char information, does the name need encoding? sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' 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)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } if (p->member[i].leader == 1){ int j; for (j = 0; j < MAX_PARTY; j++) { if (p->member[j].account_id > 0 && j != i) { mapif_party_leaved(party_id, p->member[j].account_id, p->member[j].name); } } // we'll skip name-checking and just reset everyone with the same party id [celest] // -- if anything goes wrong just uncomment the section above ^^; sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id); if (mysql_query(&mysql_handle, tmp_sql)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } // 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)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } 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)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); } } return 0; }
// パーティ脱退要求 int mapif_parse_PartyLeave(int fd,int party_id,int account_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){ 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); char t_memname[256]; jstrescapecpy(t_memname, p->member[i].name); // Update char information, does the name need encoding? sprintf(tmp_sql,"UPDATE `char` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND BINARY `name`='%s';", party_id, t_memname); 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? char t_memname[256]; jstrescapecpy(t_memname,p->member[j].name); sprintf(tmp_sql,"UPDATE `char` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND BINARY `name`='%s';", party_id, t_memname); 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 `party` WHERE `party_id`='%d'",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 */ } return 0; }