示例#1
0
// 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);
}
示例#2
0
//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;
}