diff options
author | Kenpachi Developer <Kenpachi.Developer@gmx.de> | 2020-04-14 07:49:24 +0200 |
---|---|---|
committer | Kenpachi Developer <Kenpachi.Developer@gmx.de> | 2020-04-14 07:49:24 +0200 |
commit | c475c1eb2077fa9178561f9ea11c360285d432ee (patch) | |
tree | 60c34f13f2a6b84d6640155f28c53818eded2352 /src/map | |
parent | 3d06abbc3b917b2ce1df8245a5856904e7e1fd53 (diff) | |
download | hercules-c475c1eb2077fa9178561f9ea11c360285d432ee.tar.gz hercules-c475c1eb2077fa9178561f9ea11c360285d432ee.tar.bz2 hercules-c475c1eb2077fa9178561f9ea11c360285d432ee.tar.xz hercules-c475c1eb2077fa9178561f9ea11c360285d432ee.zip |
Adjust mob_getfriendstatus() to consider characters as friends for summoned monsters like mob_getfriendhprate() does
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/mob.c | 42 | ||||
-rw-r--r-- | src/map/mob.h | 2 |
2 files changed, 24 insertions, 20 deletions
diff --git a/src/map/mob.c b/src/map/mob.c index 51a32abd9..5a20c20d2 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -3393,42 +3393,49 @@ static struct block_list *mob_getmasterhpltmaxrate(struct mob_data *md, int rate static int mob_getfriendstatus_sub(struct block_list *bl, va_list ap) { int cond1,cond2; - struct mob_data **fr = NULL, *md = NULL, *mmd = NULL; + struct block_list **fr = NULL; + struct mob_data *md = NULL; int flag=0; nullpo_ret(bl); - Assert_ret(bl->type == BL_MOB); - md = BL_UCAST(BL_MOB, bl); - nullpo_ret(mmd=va_arg(ap,struct mob_data *)); + nullpo_ret(md = va_arg(ap, struct mob_data *)); - if( mmd->bl.id == bl->id && !(battle_config.mob_ai&0x10) ) + if (md->bl.id == bl->id && (battle_config.mob_ai & 0x10) == 0) return 0; - if (battle->check_target(&mmd->bl,bl,BCT_ENEMY)>0) + if (battle->check_target(&md->bl, bl, BCT_ENEMY) > 0) return 0; cond1=va_arg(ap,int); cond2=va_arg(ap,int); - fr=va_arg(ap,struct mob_data **); + fr = va_arg(ap, struct block_list **); + + if ((*fr) != NULL) // A friend was already found. + return 0; + + struct status_change *sc = status->get_sc(bl); + if( cond2==-1 ){ int j; for(j=SC_COMMON_MIN;j<=SC_COMMON_MAX && !flag;j++){ - if ((flag=(md->sc.data[j] != NULL))) //Once an effect was found, break out. [Skotlex] + if ((flag = (sc->data[j] != NULL)) != 0) // Once an effect was found, break out. [Skotlex] break; } }else - flag=( md->sc.data[cond2] != NULL ); + flag = (sc->data[cond2] != NULL); if( flag^( cond1==MSC_FRIENDSTATUSOFF ) ) - (*fr)=md; + (*fr) = bl; return 0; } -static struct mob_data *mob_getfriendstatus(struct mob_data *md, int cond1, int cond2) +static struct block_list *mob_getfriendstatus(struct mob_data *md, int cond1, int cond2) { - struct mob_data* fr = NULL; + struct block_list *fr = NULL; nullpo_ret(md); - map->foreachinrange(mob->getfriendstatus_sub, &md->bl, 8,BL_MOB, md,cond1,cond2,&fr); + int type = (md->special_state.ai != AI_NONE) ? BL_PC : BL_MOB; + + map->foreachinrange(mob->getfriendstatus_sub, &md->bl, 8, type, md, cond1, cond2, &fr); return fr; } @@ -3440,7 +3447,6 @@ static int mobskill_use(struct mob_data *md, int64 tick, int event) struct mob_skill *ms; struct block_list *fbl = NULL; //Friend bl, which can either be a BL_PC or BL_MOB depending on the situation. [Skotlex] struct block_list *bl; - struct mob_data *fmd = NULL; int i,j,n; nullpo_ret(md); @@ -3512,7 +3518,8 @@ static int mobskill_use(struct mob_data *md, int64 tick, int event) flag = ((fbl = mob->getfriendhprate(md, ms[i].cond2, ms[i].val[0])) != NULL); break; case MSC_FRIENDSTATUSON: // friend status[num] on case MSC_FRIENDSTATUSOFF: // friend status[num] off - flag = ((fmd = mob->getfriendstatus(md, ms[i].cond1, ms[i].cond2)) != NULL); break; + flag = ((fbl = mob->getfriendstatus(md, ms[i].cond1, ms[i].cond2)) != NULL); + break; case MSC_SLAVELT: // slave < num flag = (mob->countslave(&md->bl) < c2 ); break; case MSC_ATTACKPCGT: // attack pc > num @@ -3564,7 +3571,7 @@ static int mobskill_use(struct mob_data *md, int64 tick, int event) break; FALLTHROUGH case MST_FRIEND: - bl = fbl?fbl:(fmd?&fmd->bl:&md->bl); + bl = (fbl != NULL) ? fbl : &md->bl; break; default: bl = &md->bl; @@ -3610,9 +3617,6 @@ static int mobskill_use(struct mob_data *md, int64 tick, int event) if (fbl) { bl = fbl; break; - } else if (fmd) { - bl = &fmd->bl; - break; } // else fall through FALLTHROUGH default: diff --git a/src/map/mob.h b/src/map/mob.h index 577e4db91..6ad1ce705 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -573,7 +573,7 @@ struct mob_interface { struct block_list* (*getfriendhprate) (struct mob_data *md, int min_rate, int max_rate); struct block_list* (*getmasterhpltmaxrate) (struct mob_data *md, int rate); int (*getfriendstatus_sub) (struct block_list *bl, va_list ap); - struct mob_data* (*getfriendstatus) (struct mob_data *md, int cond1, int cond2); + struct block_list *(*getfriendstatus) (struct mob_data *md, int cond1, int cond2); int (*skill_use) (struct mob_data *md, int64 tick, int event); int (*skill_event) (struct mob_data *md, struct block_list *src, int64 tick, int flag); int (*is_clone) (int class_); |