//Exp share and added zeny share [Valaris] int party_exp_share(struct party_data *p, struct block_list *src, unsigned int base_exp, unsigned int job_exp, int zeny) { struct map_session_data *sd[MAX_PARTY]; unsigned int i, c; #ifdef RENEWAL_EXP uint32 base_exp_bonus, job_exp_bonus; #endif nullpo_ret(p); //Count the number of players eligible for exp sharing for (i = c = 0; i < MAX_PARTY; i++) { if ((sd[c] = p->data[i].sd) == NULL || sd[c]->bl.m != src->m || pc_isdead(sd[c]) || (battle_config.idle_no_share && pc_isidle(sd[c]))) continue; c++; } if (c < 1) return 0; base_exp /= c; job_exp /= c; zeny /= c; if (battle_config.party_even_share_bonus && c > 1) { double bonus = 100 + battle_config.party_even_share_bonus * (c - 1); if (base_exp) base_exp = (unsigned int)cap_value(base_exp * bonus / 100, 0, UINT_MAX); if (job_exp) job_exp = (unsigned int)cap_value(job_exp * bonus / 100, 0, UINT_MAX); if (zeny) zeny = (unsigned int)cap_value(zeny * bonus / 100, INT_MIN, INT_MAX); } #ifdef RENEWAL_EXP base_exp_bonus = base_exp; job_exp_bonus = job_exp; #endif for (i = 0; i < c; i++) { #ifdef RENEWAL_EXP if (!(src && src->type == BL_MOB && ((TBL_MOB *)src)->db->mexp)) { TBL_MOB *md = BL_CAST(BL_MOB, src); int rate = 0; if (!md) return 0; rate = pc_level_penalty_mod(sd[i], md->db->lv, md->db->status.class_, 1); base_exp = (unsigned int)cap_value(base_exp_bonus * rate / 100, 1, UINT_MAX); job_exp = (unsigned int)cap_value(job_exp_bonus * rate / 100, 1, UINT_MAX); } #endif pc_gainexp(sd[i], src, base_exp, job_exp, false); if (zeny) //Zeny from mobs [Valaris] pc_getzeny(sd[i],zeny,LOG_TYPE_PICKDROP_MONSTER,NULL); } return 0; }
/** Party EXP and Zeny sharing * @param p Party data * @param src EXP source (for renewal level penalty) * @param base_exp Base EXP gained from killed mob * @param job_exp Job EXP gained from killed mob * @param zeny Zeny gained from killed mob * @author Valaris **/ void party_exp_share(struct party_data* p, struct block_list* src, unsigned int base_exp, unsigned int job_exp, int zeny) { struct map_session_data* sd[MAX_PARTY]; unsigned int i, c; #ifdef RENEWAL_EXP TBL_MOB *md = BL_CAST(BL_MOB, src); if (!md) return; #endif nullpo_retv(p); // count the number of players eligible for exp sharing for (i = c = 0; i < MAX_PARTY; i++) { if( (sd[c] = p->data[i].sd) == NULL || sd[c]->bl.m != src->m || pc_isdead(sd[c]) || (battle_config.idle_no_share && pc_isidle(sd[c])) ) continue; c++; } if (c < 1) return; base_exp/=c; job_exp/=c; zeny/=c; if (battle_config.party_even_share_bonus && c > 1) { double bonus = 100 + battle_config.party_even_share_bonus*(c-1); if (base_exp) base_exp = (unsigned int) cap_value(base_exp * bonus/100, 0, UINT_MAX); if (job_exp) job_exp = (unsigned int) cap_value(job_exp * bonus/100, 0, UINT_MAX); if (zeny) zeny = (unsigned int) cap_value(zeny * bonus/100, INT_MIN, INT_MAX); } for (i = 0; i < c; i++) { #ifdef RENEWAL_EXP uint32 base_gained = base_exp, job_gained = job_exp; if (base_exp || job_exp) { int rate = pc_level_penalty_mod(md->level - sd[i]->status.base_level, md->db->status.class_, md->db->status.mode, 1); if (rate != 100) { if (base_exp) base_gained = (unsigned int)cap_value(apply_rate(base_exp, rate), 1, UINT_MAX); if (job_exp) job_gained = (unsigned int)cap_value(apply_rate(job_exp, rate), 1, UINT_MAX); } } pc_gainexp(sd[i], src, base_gained, job_gained, 0); #else pc_gainexp(sd[i], src, base_exp, job_exp, 0); #endif if (zeny) // zeny from mobs [Valaris] pc_getzeny(sd[i],zeny,LOG_TYPE_PICKDROP_MONSTER,NULL); } }