- 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.
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10966 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
52ed64546e
commit
27488665e0
@ -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.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
2007/08/08
|
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.
|
* Implemented the evolution stat growth bonuses for homunculus.
|
||||||
* Updated the @homstats command to show evolution bonuses
|
* Updated the @homstats command to show evolution bonuses
|
||||||
* Corrected initial intimacy of a newly created homunculus (should be
|
* Corrected initial intimacy of a newly created homunculus (should be
|
||||||
|
157
src/map/mob.c
157
src/map/mob.c
@ -1587,91 +1587,66 @@ int mob_respawn(int tid, unsigned int tick, int id,int data )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Call when a mob has received damage.
|
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 char_id = 0, flag = 0;
|
int char_id = 0, flag = 0;
|
||||||
|
if(damage < 0) return; //Do nothing for absorbed damage.
|
||||||
|
|
||||||
if (damage > 0)
|
if(!damage && !(src->type&DEFAULT_ENEMY_TYPE(md)))
|
||||||
{ //Store total damage...
|
return; //Do not log non-damaging effects from non-enemies.
|
||||||
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);
|
|
||||||
|
|
||||||
switch (src->type) {
|
switch (src->type) {
|
||||||
case BL_PC:
|
case BL_PC:
|
||||||
{
|
{
|
||||||
struct map_session_data *sd = (TBL_PC*)src;
|
struct map_session_data *sd = (TBL_PC*)src;
|
||||||
char_id = sd->status.char_id;
|
char_id = sd->status.char_id;
|
||||||
|
if (damage)
|
||||||
md->attacked_id = src->id;
|
md->attacked_id = src->id;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BL_HOM: //[orn]
|
case BL_HOM: //[orn]
|
||||||
{
|
{
|
||||||
struct homun_data *hd = (TBL_HOM*)src;
|
struct homun_data *hd = (TBL_HOM*)src;
|
||||||
flag = 1;
|
flag = 1;
|
||||||
if (hd->master)
|
if (hd->master)
|
||||||
char_id = hd->master->status.char_id;
|
char_id = hd->master->status.char_id;
|
||||||
|
if (damage)
|
||||||
md->attacked_id = src->id;
|
md->attacked_id = src->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.
|
||||||
}
|
}
|
||||||
case BL_PET:
|
//Let mobs retaliate against the pet's master [Skotlex]
|
||||||
{
|
if(pd->msd && damage)
|
||||||
struct pet_data *pd = (TBL_PET*)src;
|
md->attacked_id = pd->msd->bl.id;
|
||||||
if (battle_config.pet_attack_exp_to_master && pd->msd) {
|
break;
|
||||||
char_id = pd->msd->status.char_id;
|
}
|
||||||
damage=(damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly.
|
case BL_MOB:
|
||||||
}
|
{
|
||||||
//Let mobs retaliate against the pet's master [Skotlex]
|
struct mob_data* md2 = (TBL_MOB*)src;
|
||||||
if(pd->msd)
|
if(md2->special_state.ai && md2->master_id) {
|
||||||
md->attacked_id = pd->msd->bl.id;
|
struct map_session_data* msd = map_id2sd(md2->master_id);
|
||||||
break;
|
if (msd) char_id = msd->status.char_id;
|
||||||
}
|
}
|
||||||
case BL_MOB:
|
if (!damage)
|
||||||
{
|
|
||||||
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;
|
|
||||||
break;
|
break;
|
||||||
}
|
//Let players decide whether to retaliate versus the master or the mob. [Skotlex]
|
||||||
default: //For all unhandled types.
|
if (md2->master_id && battle_config.retaliate_to_master)
|
||||||
|
md->attacked_id = md2->master_id;
|
||||||
|
else
|
||||||
md->attacked_id = src->id;
|
md->attacked_id = src->id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: //For all unhandled types.
|
||||||
|
md->attacked_id = src->id;
|
||||||
}
|
}
|
||||||
//Log damage...
|
//Log damage...
|
||||||
if (char_id && damage > 0) {
|
if(char_id) {
|
||||||
int i,minpos;
|
int i,minpos;
|
||||||
unsigned int mindmg;
|
unsigned int mindmg;
|
||||||
for(i=0,minpos=DAMAGELOG_SIZE-1,mindmg=UINT_MAX;i<DAMAGELOG_SIZE;i++){
|
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;
|
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*/)
|
if(md->special_state.ai==2/* && md->master_id == src->id*/)
|
||||||
{ //LOne WOlf explained that ANYONE can trigger the marine countdown skill. [Skotlex]
|
{ //LOne WOlf explained that ANYONE can trigger the marine countdown skill. [Skotlex]
|
||||||
|
@ -164,6 +164,7 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data);
|
|||||||
int mob_spawn(struct mob_data *md);
|
int mob_spawn(struct mob_data *md);
|
||||||
int mob_setdelayspawn(struct mob_data *md);
|
int mob_setdelayspawn(struct mob_data *md);
|
||||||
int mob_parse_dataset(struct spawn_data *data);
|
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);
|
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);
|
int mob_dead(struct mob_data *md, struct block_list *src, int type);
|
||||||
void mob_revive(struct mob_data *md, unsigned int hp);
|
void mob_revive(struct mob_data *md, unsigned int hp);
|
||||||
|
@ -5565,8 +5565,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
return 1;
|
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));
|
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.
|
if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill.
|
||||||
battle_consume_ammo(sd, skillid, skilllv);
|
battle_consume_ammo(sd, skillid, skilllv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user