// When member goes to other map or levels up. int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv) { struct party_data *p; int i; p = inter_party_fromsql(party_id); if (p == NULL) return 0; for(i = 0; i < MAX_PARTY && (p->party.member[i].account_id != account_id || p->party.member[i].char_id != char_id); i++); if (i == MAX_PARTY) return 0; if (p->party.member[i].online != online) { p->party.member[i].online = online; if (online) p->party.count++; else p->party.count--; // Even share check situations: Family state (always breaks) // character logging on/off is max/min level (update level range) // or character logging on/off has a different level (update level range using new level) if (p->family || (p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) || (p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv)) ) { p->party.member[i].lv = lv; int_party_check_lv(p); } //Send online/offline update. mapif_party_membermoved(&p->party, i); } if (p->party.member[i].lv != lv) { if(p->party.member[i].lv == p->min_lv || p->party.member[i].lv == p->max_lv) { p->party.member[i].lv = lv; int_party_check_lv(p); } else p->party.member[i].lv = lv; //There is no need to send level update to map servers //since they do nothing with it. } if (p->party.member[i].map != map) { p->party.member[i].map = map; mapif_party_membermoved(&p->party, i); } return 0; }
//----------------------- // A member change of map //----------------------- void mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, unsigned char online, int lv) { // online: 0: offline, 1:online struct party *p; int i; p = numdb_search(party_db, (CPU_INT)party_id); if (p == NULL) return; for(i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id == account_id) { // same account can have more than character in same party. we must check name here too! memset(p->member[i].map, 0, sizeof(p->member[i].map)); strncpy(p->member[i].map, map, 16); // 17 - NULL p->member[i].online = online; // online: 0: offline, 1:online p->member[i].lv = lv; mapif_party_membermoved(p, i); if (p->exp > 0 && !party_check_exp_share(p)) { p->exp = 0; mapif_party_optionchanged(fd, p, 0, 0); } break; } } return; }
// パーティマップ更新要求 static void mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, MapName map, int online, int lv) { struct party *p = party_db.search(party_id); if (p == NULL) return; for (int i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id != account_id) continue; int flag = 0; p->member[i].map = map; 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); return; } }
// パーティマップ更新要求 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; } } if(online==0) // 誰かがログアウトするごとにセーブ inter_party_save(); return 0; }
// パーティマップ更新要求 static void mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, const char *map, unsigned char online, unsigned short lv) { 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) { memcpy(p2.member[i].map,map,16); p2.member[i].map[15] = '\0'; // force \0 terminal p2.member[i].online = online; p2.member[i].lv = lv; mapif_party_membermoved(party_id, &p2.member[i]); if( p2.exp>0 && !party_check_exp_share(&p2,0) ){ p2.exp=0; mapif_party_optionchanged(fd,&p2,0,0); } break; } } partydb_save(&p2); return; }
//----------------------- // A member change of map //----------------------- void mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, unsigned char online, int lv) { // online: 0: offline, 1:online int i; 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) // party doesn't exist return; for(i = 0; i < MAX_PARTY; i++) { if (party_tmp.member[i].account_id == account_id) { // same account can have more than character in same party. we must check name here too! memset(party_tmp.member[i].map, 0, sizeof(party_tmp.member[i].map)); strncpy(party_tmp.member[i].map, map, 16); // 17 - NULL party_tmp.member[i].online = online; // online: 0: offline, 1:online party_tmp.member[i].lv = lv; mapif_party_membermoved(&party_tmp, i); if (party_tmp.exp > 0 && !party_check_exp_share(&party_tmp)) { party_tmp.exp = 0; mapif_party_optionchanged(fd, &party_tmp, 0, 0); } break; } } inter_party_tosql(party_id, &party_tmp); return; }
// When member goes to other map 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; }