diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-06-07 18:57:21 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-06-07 18:57:21 +0000 |
commit | 5d9d254ef290e9cc8acfdd08af279fdc1a439853 (patch) | |
tree | 4707121165dabe5aaff75d887a1e9ef230786659 /src/map | |
parent | b4d8c6be13e3755ec9104f5317b88069860e5aef (diff) | |
download | hercules-5d9d254ef290e9cc8acfdd08af279fdc1a439853.tar.gz hercules-5d9d254ef290e9cc8acfdd08af279fdc1a439853.tar.bz2 hercules-5d9d254ef290e9cc8acfdd08af279fdc1a439853.tar.xz hercules-5d9d254ef290e9cc8acfdd08af279fdc1a439853.zip |
- Added pc_calcexp to calculate individual exp bonuses acquired from exp's source (race bonus cards, SG Exp skills, pk-mode higher level exp)
- pc_gain_exp now also receives the source of the exp, when said source exists, bonuses are applicated as needed.
- Added status_kill when capturing a mob, should take care of the mob not respawning after caputed.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@7037 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/mob.c | 24 | ||||
-rw-r--r-- | src/map/npc.c | 4 | ||||
-rw-r--r-- | src/map/party.c | 6 | ||||
-rw-r--r-- | src/map/party.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 58 | ||||
-rw-r--r-- | src/map/pc.h | 2 | ||||
-rw-r--r-- | src/map/pet.c | 1 | ||||
-rw-r--r-- | src/map/script.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 6 | ||||
-rw-r--r-- | src/map/status.c | 1 |
10 files changed, 70 insertions, 36 deletions
diff --git a/src/map/mob.c b/src/map/mob.c index 7ee56773d..346003618 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1785,22 +1785,6 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) if (md->sc.data[SC_RICHMANKIM].timer != -1) bonus += md->sc.data[SC_RICHMANKIM].val2; - if (tmpsd[i]->expaddrace[status->race]) - bonus += tmpsd[i]->expaddrace[status->race]; - bonus += tmpsd[i]->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS]; - - if (battle_config.pk_mode && - (int)(md->db->lv - tmpsd[i]->status.base_level) >= 20) //Needed due to unsigned checks - bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] - - //SG additional exp from Blessings [Komurka] - probably can be optimalized ^^;; - if(md->class_ == tmpsd[i]->hate_mob[2] && (battle_config.allow_skill_without_day || is_day_of_star() || tmpsd[i]->sc.data[SC_MIRACLE].timer!=-1)) - bonus += 20*pc_checkskill(tmpsd[i],SG_STAR_BLESS); - else if(md->class_ == tmpsd[i]->hate_mob[1] && (battle_config.allow_skill_without_day || is_day_of_moon())) - bonus += 10*pc_checkskill(tmpsd[i],SG_MOON_BLESS); - else if(md->class_ == tmpsd[i]->hate_mob[0] && (battle_config.allow_skill_without_day || is_day_of_sun())) - bonus += 10*pc_checkskill(tmpsd[i],SG_SUN_BLESS); - if(battle_config.mobs_level_up && md->level > md->db->lv) // [Valaris] bonus += (md->level-md->db->lv)*battle_config.mobs_level_up_exp_rate; @@ -1885,14 +1869,14 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) } if(flag) { if(base_exp || job_exp) - pc_gainexp(tmpsd[i],base_exp,job_exp); + pc_gainexp(tmpsd[i], &md->bl, base_exp,job_exp); if(zeny) // zeny from mobs [Valaris] - pc_getzeny(tmpsd[i],zeny); + pc_getzeny(tmpsd[i], zeny); } } for(i=0;i<pnum;i++) //Party share. - party_exp_share(pt[i].p,md->bl.m,pt[i].base_exp,pt[i].job_exp,pt[i].zeny); + party_exp_share(pt[i].p, &md->bl, pt[i].base_exp,pt[i].job_exp,pt[i].zeny); } //End EXP giving. if (!(type&1) && @@ -2043,7 +2027,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) clif_mvp_effect(mvp_sd); clif_mvp_exp(mvp_sd,mexp); - pc_gainexp(mvp_sd,mexp,0); + pc_gainexp(mvp_sd, &md->bl, mexp,0); log_mvp[1] = mexp; if(!map[md->bl.m].flag.nomvploot) for(j=0;j<3;j++){ diff --git a/src/map/npc.c b/src/map/npc.c index 72b71b8f9..6d950399d 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1213,7 +1213,7 @@ int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) z = z * (double)skill * (double)battle_config.shop_exp/10000.;
if (z < 1)
z = 1;
- pc_gainexp(sd,0,(int)z);
+ pc_gainexp(sd,NULL,0,(int)z);
}
}
@@ -1288,7 +1288,7 @@ int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list) z = z * (double)skill * (double)battle_config.shop_exp/10000.;
if (z < 1)
z = 1;
- pc_gainexp(sd,0,(int)z);
+ pc_gainexp(sd,NULL,0,(int)z);
}
}
diff --git a/src/map/party.c b/src/map/party.c index 736dd55a2..b7c00db4d 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -659,7 +659,7 @@ int party_send_xy_clear(struct party *p) }
// exp share and added zeny share [Valaris]
-int party_exp_share(struct party *p,int map,unsigned int base_exp,unsigned int job_exp,int zeny)
+int party_exp_share(struct party *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny)
{
struct map_session_data* sd[MAX_PARTY];
int i;
@@ -668,7 +668,7 @@ int party_exp_share(struct party *p,int map,unsigned int base_exp,unsigned int j nullpo_retr(0, p);
for (i = c = 0; i < MAX_PARTY; i++)
- if ((sd[c] = p->member[i].sd)!=NULL && sd[c]->bl.m == map && !pc_isdead(sd[c])) {
+ if ((sd[c] = p->member[i].sd)!=NULL && sd[c]->bl.m == src->m && !pc_isdead(sd[c])) {
if (battle_config.idle_no_share && (sd[c]->chatID || sd[c]->vender_id || (sd[c]->idletime < (last_tick - battle_config.idle_no_share))))
continue;
c++;
@@ -694,7 +694,7 @@ int party_exp_share(struct party *p,int map,unsigned int base_exp,unsigned int j for (i = 0; i < c; i++)
{
- pc_gainexp(sd[i], base_exp, job_exp);
+ pc_gainexp(sd[i], src, base_exp, job_exp);
if (battle_config.zeny_from_mobs) // zeny from mobs [Valaris]
pc_getzeny(sd[i],bonus*zeny/(c*100));
}
diff --git a/src/map/party.h b/src/map/party.h index 76954a4c5..f813c5020 100644 --- a/src/map/party.h +++ b/src/map/party.h @@ -39,7 +39,7 @@ int party_recv_message(int party_id,int account_id,char *mes,int len); int party_check_conflict(struct map_session_data *sd);
int party_skill_check(struct map_session_data *sd, int party_id, int skillid, int skilllv);
int party_send_xy_clear(struct party *p);
-int party_exp_share(struct party *p,int map,unsigned int base_exp,unsigned int job_exp,int zeny);
+int party_exp_share(struct party *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny);
int party_share_loot(struct party *p, TBL_PC *sd, struct item *item_data);
int party_send_dot_remove(struct map_session_data *sd);
int party_sub_count(struct block_list *bl, va_list ap);
diff --git a/src/map/pc.c b/src/map/pc.c index 6b270023b..68314ba8e 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -36,6 +36,7 @@ #include "vending.h"
#include "atcommand.h"
#include "log.h"
+#include "date.h"
#ifndef TXT_ONLY // mail system [Valaris]
#include "mail.h"
@@ -3928,10 +3929,59 @@ int pc_checkjoblevelup(struct map_session_data *sd) }
/*==========================================
+ * Alters experienced based on self bonuses that do not get even shared to the party.
+ *------------------------------------------
+ */
+static void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src)
+{
+ int bonus = 0;
+ struct status_data *status = status_get_status_data(src);
+ unsigned int temp;
+
+ if (sd->expaddrace[status->race])
+ bonus += sd->expaddrace[status->race];
+ bonus += sd->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS];
+
+ //SG additional exp from Blessings [Komurka] - probably can be optimalized ^^;;
+ temp = status_get_class(src);
+ if(temp == sd->hate_mob[2] &&
+ (battle_config.allow_skill_without_day || is_day_of_star() || sd->sc.data[SC_MIRACLE].timer!=-1))
+ bonus += 20*pc_checkskill(sd,SG_STAR_BLESS);
+ else
+ if(temp == sd->hate_mob[1] &&
+ (battle_config.allow_skill_without_day || is_day_of_moon()))
+ bonus += 10*pc_checkskill(sd,SG_MOON_BLESS);
+ else
+ if(temp == sd->hate_mob[0] &&
+ (battle_config.allow_skill_without_day || is_day_of_sun()))
+ bonus += 10*pc_checkskill(sd,SG_SUN_BLESS);
+
+ if (battle_config.pk_mode &&
+ (int)(status_get_lv(src) - sd->status.base_level) >= 20)
+ bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris]
+
+ if (!bonus)
+ return;
+
+ temp = *base_exp*bonus/100;
+ if (*base_exp > UINT_MAX - temp)
+ *base_exp = UINT_MAX;
+ else
+ *base_exp += temp;
+
+ temp = *job_exp*bonus/100;
+ if (*job_exp > UINT_MAX - temp)
+ *job_exp = UINT_MAX;
+ else
+ *job_exp += temp;
+
+ return;
+}
+/*==========================================
* ??値取得
*------------------------------------------
*/
-int pc_gainexp(struct map_session_data *sd,unsigned int base_exp,unsigned int job_exp)
+int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int base_exp,unsigned int job_exp)
{
char output[256];
float nextbp=0, nextjp=0;
@@ -3944,13 +3994,13 @@ int pc_gainexp(struct map_session_data *sd,unsigned int base_exp,unsigned int jo if(!battle_config.pvp_exp && map[sd->bl.m].flag.pvp) // [MouseJstr]
return 0; // no exp on pvp maps
- if(sd->status.guild_id>0){ // ギルドに上納
+ if(sd->status.guild_id>0)
base_exp-=guild_payexp(sd,base_exp);
- }
+
+ if(src) pc_calcexp(sd, &base_exp, &job_exp, src);
nextb = pc_nextbaseexp(sd);
nextj = pc_nextjobexp(sd);
-
if(sd->state.showexp || battle_config.max_exp_gain_rate){
if (nextb > 0)
diff --git a/src/map/pc.h b/src/map/pc.h index 9959bb4ec..47dd0b4aa 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -135,7 +135,7 @@ unsigned int pc_maxbaselv(struct map_session_data *sd); unsigned int pc_maxjoblv(struct map_session_data *sd);
int pc_checkbaselevelup(struct map_session_data *sd);
int pc_checkjoblevelup(struct map_session_data *sd);
-int pc_gainexp(struct map_session_data*,unsigned int,unsigned int);
+int pc_gainexp(struct map_session_data*,struct block_list*,unsigned int,unsigned int);
unsigned int pc_nextbaseexp(struct map_session_data *);
unsigned int pc_nextjobexp(struct map_session_data *);
int pc_need_status_point(struct map_session_data *,int);
diff --git a/src/map/pet.c b/src/map/pet.c index 3f88cfb41..091f733da 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -596,6 +596,7 @@ int pet_catch_process2(struct map_session_data *sd,int target_id) if(rand()%10000 < pet_catch_rate) {
unit_remove_map(&md->bl,0);
+ status_kill(&md->bl);
clif_pet_rulet(sd,1);
// if(battle_config.etc_log)
// printf("rulet success %d\n",target_id);
diff --git a/src/map/script.c b/src/map/script.c index 181b50084..9e082a61c 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -5625,7 +5625,7 @@ int buildin_getexp(struct script_state *st) if(base<0 || job<0) return 0; if(sd) - pc_gainexp(sd,base,job); + pc_gainexp(sd,NULL,base,job); return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index 45305ba58..3bb3b6375 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3178,7 +3178,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100; if (heal_get_jobexp <= 0) heal_get_jobexp = 1; - pc_gainexp (sd, 0, heal_get_jobexp); + pc_gainexp (sd, bl, 0, heal_get_jobexp); } } break; @@ -3250,7 +3250,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (jexp < 1) jexp = 1; } if(exp > 0 || jexp > 0) - pc_gainexp (sd, exp, jexp); + pc_gainexp (sd, bl, exp, jexp); } } } @@ -3368,7 +3368,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case SA_LEVELUP: clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd, pc_nextbaseexp(sd) * 10 / 100, 0); + if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd, NULL, pc_nextbaseexp(sd) * 10 / 100, 0); break; case SA_INSTANTDEATH: clif_skill_nodamage(src,bl,skillid,skilllv,1); diff --git a/src/map/status.c b/src/map/status.c index afc1f2290..cdc916bdc 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -644,7 +644,6 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s map_delblock(target); unit_free(target); } - return hp+sp; } |