// EXP公平分配できるかチェック int party_check_exp_share(struct party *p) { int i, oi[MAX_PARTY], dudes=0; int maxlv=0,minlv=0x7fffffff; for(i=0;i<MAX_PARTY;i++){ int lv=p->member[i].lv; if (!lv) continue; if( p->member[i].online ){ if( lv < minlv ) minlv=lv; if( maxlv < lv ) maxlv=lv; if( lv >= 70 ) dudes+=1000; oi[dudes%1000] = i; dudes++; } } if((dudes/1000 >= 2) && (dudes%1000 == 3) && (!strcmp(p->member[oi[0]].map,p->member[oi[1]].map)) && (!strcmp(p->member[oi[1]].map,p->member[oi[2]].map)) && maxlv-minlv>party_share_level ) { int pl1=0,pl2=0,pl3=0; pl1=char_nick2id(p->member[oi[0]].name); pl2=char_nick2id(p->member[oi[1]].name); pl3=char_nick2id(p->member[oi[2]].name); ShowDebug("PARTY: group of 3 Id1 %d lv %d name %s Id2 %d lv %d name %s Id3 %d lv %d name %s\n",pl1,p->member[oi[0]].lv,p->member[oi[0]].name,pl2,p->member[oi[1]].lv,p->member[oi[1]].name,pl3,p->member[oi[2]].lv,p->member[oi[2]].name); if (char_married(pl1,pl2) && char_child(pl1,pl3)) return 1; if (char_married(pl1,pl3) && char_child(pl1,pl2)) return 1; if (char_married(pl2,pl3) && char_child(pl2,pl1)) return 1; } return (maxlv==0 || maxlv-minlv<=party_share_level); }
//Calculates the state of a party. static void int_party_calc_state(struct party_data *p) { int i; unsigned int lv; p->min_lv = UINT_MAX; p->max_lv = 0; p->party.count = p->size = p->family = 0; //Check party size for(i=0; i<MAX_PARTY; i++) { if(!p->party.member[i].lv) continue; p->size++; if(p->party.member[i].online) p->party.count++; } //Check Family State. if(p->size == 2) { if(char_child(p->party.member[0].char_id,p->party.member[1].char_id)) p->family = p->party.member[1].char_id; else if(char_child(p->party.member[1].char_id,p->party.member[0].char_id)) p->family = p->party.member[0].char_id; } else if(p->size == 3) { p->family = char_family( p->party.member[0].char_id, p->party.member[1].char_id, p->party.member[2].char_id ); } //max/min levels. for(i=0; i<MAX_PARTY; i++) { lv=p->party.member[i].lv; if(!lv) continue; if(p->party.member[i].online && //On families, the kid is not counted towards exp share rules. p->party.member[i].char_id != p->family) { if(lv < p->min_lv) p->min_lv=lv; if(p->max_lv < lv) p->max_lv=lv; } } if(p->party.exp && !party_check_exp_share(p)) { p->party.exp = 0; //Set off even share. mapif_party_optionchanged(0, &p->party, 0, 0); } return; }