// パ?ティ追加要求 int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) { struct party_data *p; int i; p = idb_get(party_db, party_id); if (p == NULL || p->size == MAX_PARTY) { mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1); return 0; } for(i = 0; i < MAX_PARTY; i++) { if (p->party.member[i].account_id == 0) { memcpy(&p->party.member[i], member, sizeof(struct party_member)); p->party.member[i].leader = 0; if (p->party.member[i].online) p->party.count++; p->size++; if (p->size == 3) //Check family state. int_party_calc_state(p); else //Check even share range. if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) { if (p->family) p->family = 0; //Family state broken. int_party_check_lv(p); } mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0); mapif_party_info(-1, &p->party); return 0; } } mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1); return 0; }
// Create Party int mapif_parse_CreateParty (int fd, char *name, int item, int item2, struct party_member *leader) { struct party_data *p; int i; if ( (p = search_partyname (name)) != NULL) { mapif_party_created (fd, leader->account_id, leader->char_id, NULL); return 0; } // 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 < NAME_LENGTH && name[i]; i++) if (strchr (char_name_letters, name[i]) == NULL) { mapif_party_created (fd, leader->account_id, leader->char_id, NULL); return 0; } } else if (char_name_option == 2) // letters/symbols in char_name_letters are forbidden { for (i = 0; i < NAME_LENGTH && name[i]; i++) if (strchr (char_name_letters, name[i]) != NULL) { mapif_party_created (fd, leader->account_id, leader->char_id, NULL); return 0; } } p = (struct party_data *) aCalloc (1, sizeof (struct party_data)); memcpy (p->party.name, name, NAME_LENGTH); p->party.exp = 0; p->party.item = (item ? 1 : 0) | (item2 ? 2 : 0); memcpy (&p->party.member[0], leader, sizeof (struct party_member)); p->party.member[0].leader = 1; p->party.member[0].online = 1; p->party.party_id = -1; //New party. if (inter_party_tosql (&p->party, PS_CREATE | PS_ADDMEMBER, 0)) { //Add party to db int_party_calc_state (p); idb_put (party_db_, p->party.party_id, p); mapif_party_info (fd, &p->party, 0); mapif_party_created (fd, leader->account_id, leader->char_id, &p->party); } else //Failed to create party. { aFree (p); mapif_party_created (fd, leader->account_id, leader->char_id, NULL); } return 0; }
// パ?ティ int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader) { struct party_data *p; int i; //FIXME: this should be removed once the savefiles can handle all symbols for(i = 0; i < NAME_LENGTH && name[i]; i++) { if (!(name[i] & 0xe0) || name[i] == 0x7f) { ShowInfo("int_party: illegal party name [%s]\n", name); mapif_party_created(fd, leader->account_id, leader->char_id, NULL); return 0; } } if ((p = search_partyname(name)) != NULL) { ShowInfo("int_party: same name party exists [%s]\n", name); mapif_party_created(fd, leader->account_id, leader->char_id, NULL); return 0; } // 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 < NAME_LENGTH && name[i]; i++) if (strchr(char_name_letters, name[i]) == NULL) { mapif_party_created(fd, leader->account_id, leader->char_id, NULL); return 0; } } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden for (i = 0; i < NAME_LENGTH && name[i]; i++) if (strchr(char_name_letters, name[i]) != NULL) { mapif_party_created(fd, leader->account_id, leader->char_id, NULL); return 0; } } p = (struct party_data *) aCalloc(sizeof(struct party_data), 1); if (p == NULL) { ShowFatalError("int_party: out of memory !\n"); mapif_party_created(fd,leader->account_id,leader->char_id,NULL); return 0; } p->party.party_id = party_newid++; memcpy(p->party.name, name, NAME_LENGTH); p->party.exp = 0; p->party.item=(item?1:0)|(item2?2:0); memcpy(&p->party.member[0], leader, sizeof(struct party_member)); p->party.member[0].leader = 1; int_party_calc_state(p); idb_put(party_db, p->party.party_id, p); mapif_party_info(fd, &p->party, 0); mapif_party_created(fd, leader->account_id, leader->char_id, &p->party); return 0; }
//Used to update party share level range in run time int mapif_parse_PartyShareLevel(int fd,unsigned int share_lvl) { struct party_data *p; DBIterator* iter = db_iterator(party_db_); party_share_level = share_lvl; for(p = dbi_first(iter); dbi_exists(iter); p = dbi_next(iter)) { //Update online parties if(p->party.count > 1) int_party_calc_state(p); } dbi_destroy(iter); return 1; }
int mapif_parse_PartyShareLevel(int fd,unsigned int share_lvl) { struct party_data *p; DBIterator* iter = db_iterator(party_db_); party_share_level = share_lvl; for(p = dbi_first(iter); dbi_exists(iter); p = dbi_next(iter)) { //Update online parties if(p->party.count > 1) int_party_calc_state(p); else if(!p->party.count) //Remove parties from memory that have no players online idb_remove(party_db_, p->party.party_id); } dbi_destroy(iter); return 1; }
// パーティ追加要求 int mapif_parse_PartyAddMember (int fd, int party_id, struct party_member *member) { struct party_data *p; int i; p = inter_party_fromsql (party_id); if (p == NULL || p->size == MAX_PARTY) { mapif_party_memberadded (fd, party_id, member->account_id, member->char_id, 1); return 0; } ARR_FIND (0, MAX_PARTY, i, p->party.member[i].account_id == 0); if (i == MAX_PARTY) { // Party full mapif_party_memberadded (fd, party_id, member->account_id, member->char_id, 1); return 0; } memcpy (&p->party.member[i], member, sizeof (struct party_member)); p->party.member[i].leader = 0; if (p->party.member[i].online) p->party.count++; p->size++; if (p->size == 3) //Check family state. int_party_calc_state (p); else //Check even share range. if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) { if (p->family) p->family = 0; //Family state broken. int_party_check_lv (p); } mapif_party_info (-1, &p->party, 0); mapif_party_memberadded (fd, party_id, member->account_id, member->char_id, 0); inter_party_tosql (&p->party, PS_ADDMEMBER, i); return 0; }
// パ?ティデ?タのロ?ド 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; }
// Read party from mysql struct party_data *inter_party_fromsql(int party_id) { int leader_id = 0; int leader_char = 0; struct party_data* p; struct party_member* m; char* data; size_t len; int i; #ifdef NOISY ShowInfo("Load party request ("CL_BOLD"%d"CL_RESET")\n", party_id); #endif if( party_id <= 0 ) return NULL; //Load from memory p = (struct party_data*)idb_get(party_db_, party_id); if( p != NULL ) return p; p = party_pt; memset(p, 0, sizeof(struct party_data)); if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `party_id`, `name`,`exp`,`item`, `leader_id`, `leader_char` FROM `%s` WHERE `party_id`='%d'", party_db, party_id) ) { Sql_ShowDebug(sql_handle); return NULL; } if( SQL_SUCCESS != Sql_NextRow(sql_handle) ) return NULL; p->party.party_id = party_id; Sql_GetData(sql_handle, 1, &data, &len); memcpy(p->party.name, data, min(len, NAME_LENGTH)); Sql_GetData(sql_handle, 2, &data, NULL); p->party.exp = (atoi(data) ? 1 : 0); Sql_GetData(sql_handle, 3, &data, NULL); p->party.item = atoi(data); Sql_GetData(sql_handle, 4, &data, NULL); leader_id = atoi(data); Sql_GetData(sql_handle, 5, &data, NULL); leader_char = atoi(data); Sql_FreeResult(sql_handle); // Load members if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`char_id`,`name`,`base_level`,`last_map`,`online`,`class` FROM `%s` WHERE `party_id`='%d'", char_db, party_id) ) { Sql_ShowDebug(sql_handle); return NULL; } for( i = 0; i < MAX_PARTY && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i ) { m = &p->party.member[i]; Sql_GetData(sql_handle, 0, &data, NULL); m->account_id = atoi(data); Sql_GetData(sql_handle, 1, &data, NULL); m->char_id = atoi(data); Sql_GetData(sql_handle, 2, &data, &len); memcpy(m->name, data, min(len, NAME_LENGTH)); Sql_GetData(sql_handle, 3, &data, NULL); m->lv = atoi(data); Sql_GetData(sql_handle, 4, &data, NULL); m->map = mapindex_name2id(data); Sql_GetData(sql_handle, 5, &data, NULL); m->online = (atoi(data) ? 1 : 0); Sql_GetData(sql_handle, 6, &data, NULL); m->class_ = atoi(data); m->leader = (m->account_id == leader_id && m->char_id == leader_char ? 1 : 0); } Sql_FreeResult(sql_handle); if( save_log ) ShowInfo("Party loaded (%d - %s).\n", party_id, p->party.name); //Add party to memory. CREATE(p, struct party_data, 1); memcpy(p, party_pt, sizeof(struct party_data)); //init state int_party_calc_state(p); idb_put(party_db_, party_id, p); return p; }