diff options
Diffstat (limited to 'src/map/mob.c')
-rw-r--r-- | src/map/mob.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/map/mob.c b/src/map/mob.c index 48cbbf6f2..60b6977bb 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1364,10 +1364,10 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md, int64 tick) ) { short x = bl->x, y = bl->y; mob_stop_attack(md); - const struct mob_data *m_md = BL_CCAST(BL_MOB, bl); - nullpo_retr(0, m_md); - if (map->search_freecell(&md->bl, bl->m, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 1) - && (battle_config.slave_chase_masters_chasetarget == 0 || !mob->is_in_battle_state(m_md)) + const struct mob_data *m_md = BL_CCAST(BL_MOB, bl); // Can be NULL due to master being BL_PC + // If master is BL_MOB and in battle, lock & chase to master's target instead, unless configured not to. + if ((battle_config.slave_chase_masters_chasetarget == 0 || (m_md != NULL && !mob->is_in_battle_state(m_md))) + && map->search_freecell(&md->bl, bl->m, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 1) && unit->walktoxy(&md->bl, x, y, 0)) return 1; } @@ -1380,13 +1380,12 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md, int64 tick) //Avoid attempting to lock the master's target too often to avoid unnecessary overload. [Skotlex] if (DIFF_TICK(md->last_linktime, tick) < MIN_MOBLINKTIME && !md->target_id) { struct unit_data *ud = unit->bl2ud(bl); - struct mob_data *m_md = BL_CAST(BL_MOB, bl); + struct mob_data *m_md = BL_CAST(BL_MOB, bl); // Can be NULL due to master being BL_PC nullpo_retr(0, ud); - nullpo_retr(0, m_md); md->last_linktime = tick; struct block_list *tbl = NULL; - if (battle_config.slave_chase_masters_chasetarget == 1 && m_md->target_id != 0) { // possibly chasing something + if (battle_config.slave_chase_masters_chasetarget == 1 && m_md != NULL && m_md->target_id != 0) { // possibly chasing something tbl = map->id2bl(m_md->target_id); } else if (ud->target != 0 && ud->state.attack_continue != 0) { tbl = map->id2bl(ud->target); @@ -2237,6 +2236,14 @@ static void mob_log_damage(struct mob_data *md, struct block_list *src, int dama md->dmglog[minpos].flag= flag; md->dmglog[minpos].dmg = damage; } +#if (PACKETVER >= 20120404 && PACKETVER < 20131223) + // Show HP bar to all chars who hit the mob (fixes TF_STEAL not showing HP bar right away but only when target leaves/re-enters sight range) + if (battle_config.show_monster_hp_bar != 0 && (md->status.mode & MD_BOSS) == 0) { + struct map_session_data *sd = map->charid2sd(char_id); + if (sd != NULL && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE)) // check if in range + clif->monster_hp_bar(md, sd); + } +#endif } return; } |