diff options
-rw-r--r-- | Changelog-Trunk.txt | 3 | ||||
-rw-r--r-- | src/map/mob.c | 159 | ||||
-rw-r--r-- | src/map/mob.h | 1 | ||||
-rw-r--r-- | src/map/skill.c | 4 |
4 files changed, 93 insertions, 74 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 990833092..79a163d3e 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/08/08 + * Moved damage logging to mob_log_damage, now non-damage targetted (or + splash) skills also get logged into the monster's 'damage history' which + affects the exp-bonus per attacker setting. * Implemented the evolution stat growth bonuses for homunculus. * Updated the @homstats command to show evolution bonuses * Corrected initial intimacy of a newly created homunculus (should be diff --git a/src/map/mob.c b/src/map/mob.c index 2799b76a4..d15a50a27 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1587,91 +1587,66 @@ int mob_respawn(int tid, unsigned int tick, int id,int data ) return 1; } -//Call when a mob has received damage. -void mob_damage(struct mob_data *md, struct block_list *src, int damage) +void mob_log_damage(struct mob_data *md, struct block_list *src, int damage) { int char_id = 0, flag = 0; + if(damage < 0) return; //Do nothing for absorbed damage. - if (damage > 0) - { //Store total damage... - if (UINT_MAX - (unsigned int)damage > md->tdmg) - md->tdmg+=damage; - else if (md->tdmg == UINT_MAX) - damage = 0; //Stop recording damage once the cap has been reached. - else { //Cap damage log... - damage = (int)(UINT_MAX - md->tdmg); - md->tdmg = UINT_MAX; - } - if (md->state.aggressive) - { //No longer aggressive, change to retaliate AI. - md->state.aggressive = 0; - if(md->state.skillstate== MSS_ANGRY) - md->state.skillstate = MSS_BERSERK; - if(md->state.skillstate== MSS_FOLLOW) - md->state.skillstate = MSS_RUSH; - } - } - - if(md->guardian_data && md->guardian_data->number < MAX_GUARDIANS) // guardian hp update [Valaris] (updated by [Skotlex]) - md->guardian_data->castle->guardian[md->guardian_data->number].hp = md->status.hp; - - if (battle_config.show_mob_info&3) - clif_charnameack (0, &md->bl); - - if (!src) - return; - - if(md->nd) - mob_script_callback(md, src, CALLBACK_ATTACK); + if(!damage && !(src->type&DEFAULT_ENEMY_TYPE(md))) + return; //Do not log non-damaging effects from non-enemies. switch (src->type) { - case BL_PC: - { - struct map_session_data *sd = (TBL_PC*)src; - char_id = sd->status.char_id; + case BL_PC: + { + struct map_session_data *sd = (TBL_PC*)src; + char_id = sd->status.char_id; + if (damage) md->attacked_id = src->id; - break; - } - case BL_HOM: //[orn] - { - struct homun_data *hd = (TBL_HOM*)src; - flag = 1; - if (hd->master) - char_id = hd->master->status.char_id; + break; + } + case BL_HOM: //[orn] + { + struct homun_data *hd = (TBL_HOM*)src; + flag = 1; + if (hd->master) + char_id = hd->master->status.char_id; + if (damage) md->attacked_id = src->id; - break; - } - case BL_PET: - { - struct pet_data *pd = (TBL_PET*)src; - if (battle_config.pet_attack_exp_to_master && pd->msd) { - char_id = pd->msd->status.char_id; - damage=(damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly. - } - //Let mobs retaliate against the pet's master [Skotlex] - if(pd->msd) - md->attacked_id = pd->msd->bl.id; - break; + break; + } + case BL_PET: + { + struct pet_data *pd = (TBL_PET*)src; + if (battle_config.pet_attack_exp_to_master && pd->msd) { + char_id = pd->msd->status.char_id; + damage=(damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly. + } + //Let mobs retaliate against the pet's master [Skotlex] + if(pd->msd && damage) + md->attacked_id = pd->msd->bl.id; + break; + } + case BL_MOB: + { + struct mob_data* md2 = (TBL_MOB*)src; + if(md2->special_state.ai && md2->master_id) { + struct map_session_data* msd = map_id2sd(md2->master_id); + if (msd) char_id = msd->status.char_id; } - case BL_MOB: - { - struct mob_data* md2 = (TBL_MOB*)src; - if(md2->special_state.ai && md2->master_id) { - struct map_session_data* msd = map_id2sd(md2->master_id); - if (msd) char_id = msd->status.char_id; - } - //Let players decide whether to retaliate versus the master or the mob. [Skotlex] - if (md2->master_id && battle_config.retaliate_to_master) - md->attacked_id = md2->master_id; - else - md->attacked_id = src->id; + if (!damage) break; - } - default: //For all unhandled types. + //Let players decide whether to retaliate versus the master or the mob. [Skotlex] + if (md2->master_id && battle_config.retaliate_to_master) + md->attacked_id = md2->master_id; + else md->attacked_id = src->id; + break; + } + default: //For all unhandled types. + md->attacked_id = src->id; } //Log damage... - if (char_id && damage > 0) { + if(char_id) { int i,minpos; unsigned int mindmg; for(i=0,minpos=DAMAGELOG_SIZE-1,mindmg=UINT_MAX;i<DAMAGELOG_SIZE;i++){ @@ -1697,6 +1672,44 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage) md->dmglog[minpos].dmg = damage; } } + return; +} +//Call when a mob has received damage. +void mob_damage(struct mob_data *md, struct block_list *src, int damage) +{ + if (damage > 0) + { //Store total damage... + if (UINT_MAX - (unsigned int)damage > md->tdmg) + md->tdmg+=damage; + else if (md->tdmg == UINT_MAX) + damage = 0; //Stop recording damage once the cap has been reached. + else { //Cap damage log... + damage = (int)(UINT_MAX - md->tdmg); + md->tdmg = UINT_MAX; + } + if (md->state.aggressive) + { //No longer aggressive, change to retaliate AI. + md->state.aggressive = 0; + if(md->state.skillstate== MSS_ANGRY) + md->state.skillstate = MSS_BERSERK; + if(md->state.skillstate== MSS_FOLLOW) + md->state.skillstate = MSS_RUSH; + } + //Log damage + if (src) mob_log_damage(md, src, damage); + } + + if(md->guardian_data && md->guardian_data->number < MAX_GUARDIANS) // guardian hp update [Valaris] (updated by [Skotlex]) + md->guardian_data->castle->guardian[md->guardian_data->number].hp = md->status.hp; + + if (battle_config.show_mob_info&3) + clif_charnameack (0, &md->bl); + + if (!src) + return; + + if(md->nd) + mob_script_callback(md, src, CALLBACK_ATTACK); if(md->special_state.ai==2/* && md->master_id == src->id*/) { //LOne WOlf explained that ANYONE can trigger the marine countdown skill. [Skotlex] diff --git a/src/map/mob.h b/src/map/mob.h index c17104d6e..71abe8d8d 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -164,6 +164,7 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data); int mob_spawn(struct mob_data *md); int mob_setdelayspawn(struct mob_data *md); int mob_parse_dataset(struct spawn_data *data); +void mob_log_damage(struct mob_data *md, struct block_list *src, int damage); void mob_damage(struct mob_data *md, struct block_list *src, int damage); int mob_dead(struct mob_data *md, struct block_list *src, int type); void mob_revive(struct mob_data *md, unsigned int hp); diff --git a/src/map/skill.c b/src/map/skill.c index 431278123..91757aca1 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5565,8 +5565,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in return 1; } - if (dstmd) //Mob skill event for no damage skills (damage ones are handled in battle_calc_damage) [Skotlex] + if (dstmd) { //Mob skill event for no damage skills (damage ones are handled in battle_calc_damage) [Skotlex] + mob_log_damage(dstmd, src, 0); //Log interaction (counts as 'attacker' for the exp bonus) mobskill_event(dstmd, src, tick, MSC_SKILLUSED|(skillid<<16)); + } if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. battle_consume_ammo(sd, skillid, skilllv); |