diff options
-rw-r--r-- | src/map/mob.c | 32 | ||||
-rw-r--r-- | src/map/mob.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 4 |
3 files changed, 22 insertions, 16 deletions
diff --git a/src/map/mob.c b/src/map/mob.c index 3ab50da79..803453718 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1837,14 +1837,13 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) case BL_PET: { struct pet_data *pd = (TBL_PET*)src; - if( battle_config.pet_attack_exp_to_master && pd->msd ) + flag = 2; + if( pd->msd ) { char_id = pd->msd->status.char_id; - damage = (damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly. + if( damage ) //Let mobs retaliate against the pet's master [Skotlex] + md->attacked_id = pd->msd->bl.id; } - //Let mobs retaliate against the pet's master [Skotlex] - if( pd->msd && damage ) - md->attacked_id = pd->msd->bl.id; break; } case BL_MOB: @@ -2014,8 +2013,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) count++; //Only logged into same map chars are counted for the total. if (pc_isdead(tsd)) continue; // skip dead players - if(md->dmglog[i].flag && !merc_is_hom_active(tsd->hd)) + if(md->dmglog[i].flag == 1 && !merc_is_hom_active(tsd->hd)) continue; // skip homunc's share if inactive + if( md->dmglog[i].flag == 2 && (!tsd->status.pet_id || !tsd->pd) ) + continue; // skip pet's share if inactive if(md->dmglog[i].dmg > mvp_damage) { @@ -2027,7 +2028,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) tmpsd[i] = tsd; // record as valid damage-log entry - if(!md->dmglog[i].flag && flaghom) + if(!md->dmglog[i].flag == 1 && flaghom) flaghom = 0; // Damage received from other Types != Homunculus } @@ -2092,8 +2093,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) per /=2.; else if(md->special_state.size==2) per *=2.; - - + + if( md->dmglog[i].flag == 2 ) + per *= battle_config.pet_attack_exp_rate/100.; + if(battle_config.zeny_from_mobs && md->level) { // zeny calculation moblv + random moblv [Valaris] zeny=(int) ((md->level+rand()%md->level)*per*bonus/100.); @@ -2106,12 +2109,12 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) else base_exp = (unsigned int)cap_value(md->db->base_exp * per * bonus/100. * map[m].bexp/100., 1, UINT_MAX); - if (map[m].flag.nojobexp || !md->db->job_exp || md->dmglog[i].flag) //Homun earned job-exp is always lost. + if (map[m].flag.nojobexp || !md->db->job_exp || md->dmglog[i].flag == 1) //Homun earned job-exp is always lost. job_exp = 0; else job_exp = (unsigned int)cap_value(md->db->job_exp * per * bonus/100. * map[m].jexp/100., 1, UINT_MAX); - if((temp = tmpsd[i]->status.party_id )>0 && !md->dmglog[i].flag) //Homun-done damage (flag 1) is not given to party + if((temp = tmpsd[i]->status.party_id )>0 && !md->dmglog[i].flag == 1) //Homun-done damage (flag 1) is not given to party { int j; for(j=0;j<pnum && pt[j].id!=temp;j++); //Locate party. @@ -2143,10 +2146,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) } } if(flag) { - if(base_exp && md->dmglog[i].flag) //tmpsd[i] is null if it has no homunc. + if(base_exp && md->dmglog[i].flag == 1) //tmpsd[i] is null if it has no homunc. merc_hom_gainexp(tmpsd[i]->hd, base_exp); if(base_exp || job_exp) - pc_gainexp(tmpsd[i], &md->bl, base_exp, job_exp); + { + if( md->dmglog[i].flag != 2 || battle_config.pet_attack_exp_to_master ) + pc_gainexp(tmpsd[i], &md->bl, base_exp, job_exp); + } if(zeny) // zeny from mobs [Valaris] pc_getzeny(tmpsd[i], zeny); } diff --git a/src/map/mob.h b/src/map/mob.h index 235e93756..b5127310f 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -121,7 +121,7 @@ struct mob_data { struct { int id; unsigned int dmg; - unsigned flag : 1; //0: Normal. 1: Homunc exp + unsigned flag : 2; //0: Normal. 1: Homunc exp. 2: Pet exp } dmglog[DAMAGELOG_SIZE]; struct spawn_data *spawn; //Spawn data. int spawn_timer; //Required for Convex Mirror diff --git a/src/map/pc.c b/src/map/pc.c index a186d4c6c..8b118270b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -7369,8 +7369,8 @@ void pc_bleeding (struct map_session_data *sd, unsigned int diff_tick) { int hp = 0, sp = 0; - //if( pc_isdead(sd) ) - // return; + if( pc_isdead(sd) ) + return; if (sd->hp_loss.value) { sd->hp_loss.tick += diff_tick; |