|
@@ -1020,16 +1020,26 @@ int party_send_xy_clear(struct party_data *p)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-// 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)
|
|
|
+/** 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
|
|
|
- uint32 base_exp_bonus, job_exp_bonus;
|
|
|
+#ifdef RENEWAL
|
|
|
+ TBL_MOB *md = BL_CAST(BL_MOB, src);
|
|
|
+
|
|
|
+ if (!md)
|
|
|
+ return;
|
|
|
#endif
|
|
|
|
|
|
- nullpo_ret(p);
|
|
|
+ nullpo_retv(p);
|
|
|
|
|
|
// count the number of players eligible for exp sharing
|
|
|
for (i = c = 0; i < MAX_PARTY; i++) {
|
|
@@ -1038,7 +1048,7 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b
|
|
|
c++;
|
|
|
}
|
|
|
if (c < 1)
|
|
|
- return 0;
|
|
|
+ return;
|
|
|
|
|
|
base_exp/=c;
|
|
|
job_exp/=c;
|
|
@@ -1055,37 +1065,26 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b
|
|
|
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( (base_exp_bonus || job_exp_bonus) && !(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(md->db->lv - sd[i]->status.base_level, md->db->status.class_, md->db->status.mode, 1);
|
|
|
+ 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_bonus)
|
|
|
- base_exp = (unsigned int)cap_value(base_exp_bonus * rate / 100, 1, UINT_MAX);
|
|
|
- if (job_exp_bonus)
|
|
|
- job_exp = (unsigned int)cap_value(job_exp_bonus * rate / 100, 1, UINT_MAX);
|
|
|
+ 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);
|
|
|
}
|
|
|
}
|
|
|
-#endif
|
|
|
-
|
|
|
+ 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);
|
|
|
}
|
|
|
-
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
//Does party loot. first_charid holds the charid of the player who has time priority to take the item.
|